En nuestro seminario analizaremos cómo factores tecnológicos impactan en la salud mental a nivel de España.
Pregunta 1: ¿Cuál es el perfil de la población más digitalizada en España y cuál es el perfil de la población con más problemas de salud mental?
Utilizaremos datos procesados con R, provenientes de la siguiente fuente oficial:
Para entender la magnitud del problema, primero analizamos la distribución de la depresión según los siguientes factores.
Depresión por Situación Laboral y Sexo
Se representa en el eje x el porcentaje de cuadros depresivos, en el eje y la situación laboral y se dividen los resultados en hombres y mujeres.
En el siguiente gráfico vemos datos depresivos mayores en mujeres que en hombres.
Dato Crítico: El grupo de Desempleo presenta las tasas más altas de Cuadro Depresivo Mayor, superando significativamente al grupo que trabaja .
# Código extraído de: Tabla_situacion_laboral.R y Grafico_situacion_laboral.R
# Tabla
datos_grafico_estudios <- mis_datos_salud_mental$depresion_actividad_economica %>%
mutate(
Porcentaje = parse_number(Total, locale = locale(decimal_mark = ","))
) %>%
filter(
Sexo != "Ambos sexos",
Actividad.económica != "TOTAL",
Prevalencia.depresión %in% c("Cuadro depresivo mayor", "Otros cuadros depresivos")
)
# Gráfico
g_actividad_apilado <- ggplot(datos_grafico_estudios,
aes(x = reorder(Actividad.económica, Porcentaje),
y = Porcentaje,
fill = Prevalencia.depresión)) +
geom_bar(stat = "identity") +
geom_text(
aes(label = paste0(round(Porcentaje, 1), "%")),
position = position_stack(vjust = 0.5),
color = "black",
size = 2,
fontface = "bold"
)+
facet_wrap(~ Sexo) +
coord_flip() +
labs(
title = "Depresión por Situación Laboral y Sexo",
x = "", # Dejamos vacío porque los nombres de actividad ya describen el eje
y = "Porcentaje Total (%)",
fill = "Diagnóstico"
) +
scale_fill_brewer(palette = "Reds") +
theme_minimal() +
theme(
legend.position = "bottom",
plot.title = element_text(face = "bold")
)
print(g_actividad_apilado)Intensidad de la Depresión por nivel de estudios
Analizamos la gravedad de la depresión en función de los estudios.
Dato Crítico: Personas que tienen un nivel de estudios inferior, son las que más cuadros depresivos padecen.
# Código extraído de: Tabla_nivel_estudios.R y Grafico_nivel_estudios.R
tabla_nivel_estudios <- nivel_estudios_parseado %>%
tidyr::separate(
col = Nombre,
into = c("Sexo", "Edad", "Nivel_de_estudios", "Prevalencia_depresion"),
sep = ", "
) %>%
rename(Porcentaje = Valor) %>%
select(-Secreto)
datos_grafico_estudios <- tabla_nivel_estudios %>%
filter(
Sexo != "Ambos sexos",
Nivel_de_estudios != "Total",
Edad == "TOTAL",
Prevalencia_depresion %in% c("Cuadro depresivo mayor", "Otros cuadros depresivos")
) %>%
mutate(Nivel_de_estudios= factor(
Nivel_de_estudios, levels = c("TOTAL", "Básico e inferior", "Intermedio","Superior" )
)
)
grafico_nivel_estudios<- ggplot(datos_grafico_estudios,
aes(x = Nivel_de_estudios,
y = Porcentaje,
fill = Prevalencia_depresion)) +
geom_col() +
facet_wrap(~ Sexo) +
coord_flip() +
labs(
title = "Depresión por Nivel de Estudios y Sexo",
subtitle = "Cuadro depresivo mayor y Otros cuadros depresivos",
x = "Nivel de Estudios",
y = "Porcentaje Total de Prevalencia (%)",
fill = "Prevalencia"
) +
scale_fill_brewer(palette = "Reds") +
theme_minimal()
print(datos_grafico_estudios)## # A tibble: 16 × 5
## Sexo Edad Nivel_de_estudios Prevalencia_depresion Porcentaje
## <chr> <chr> <fct> <chr> <dbl>
## 1 Hombres TOTAL TOTAL Cuadro depresivo mayor 1.45
## 2 Hombres TOTAL TOTAL Otros cuadros depresivos 2.03
## 3 Hombres TOTAL Básico e inferior Cuadro depresivo mayor 1.92
## 4 Hombres TOTAL Básico e inferior Otros cuadros depresivos 2.73
## 5 Hombres TOTAL Intermedio Cuadro depresivo mayor 0.91
## 6 Hombres TOTAL Intermedio Otros cuadros depresivos 1.36
## 7 Hombres TOTAL Superior Cuadro depresivo mayor 1.05
## 8 Hombres TOTAL Superior Otros cuadros depresivos 1.35
## 9 Mujeres TOTAL TOTAL Cuadro depresivo mayor 3.42
## 10 Mujeres TOTAL TOTAL Otros cuadros depresivos 3.72
## 11 Mujeres TOTAL Básico e inferior Cuadro depresivo mayor 4.71
## 12 Mujeres TOTAL Básico e inferior Otros cuadros depresivos 5.14
## 13 Mujeres TOTAL Intermedio Cuadro depresivo mayor 2.82
## 14 Mujeres TOTAL Intermedio Otros cuadros depresivos 3.28
## 15 Mujeres TOTAL Superior Cuadro depresivo mayor 1.77
## 16 Mujeres TOTAL Superior Otros cuadros depresivos 1.76
A continuación, establecemos el perfil tecnológico de España, observando la brecha generacional en las distintas Comunidades Autónomas.
Niños (10-15 años): Nativos digitales.
Adultos (16-74 años): Usuarios mayoritarios.
Mayores (75+ años): Donde reside la mayor brecha de acceso.
# Corrección nombres
uso_tic_total_corregido <- uso_tic_total %>%
mutate(
Comunidad = case_when(
Comunidad == "Andalucía" ~ "Andalucía",
Comunidad == "Aragón" ~ "Aragón",
Comunidad == "Asturias, Principado de" ~ "Asturias",
Comunidad == "Balears, Illes" ~ "Baleares",
Comunidad == "Canarias" ~ "Canarias",
Comunidad == "Cantabria" ~ "Cantabria",
Comunidad == "Castilla y León" ~ "Castilla y León",
Comunidad == "Castilla - La Mancha" ~ "Castilla - La Mancha",
Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
Comunidad == "Extremadura" ~ "Extremadura",
Comunidad == "Galicia" ~ "Galicia",
Comunidad == "Madrid, Comunidad de" ~ "Madrid",
Comunidad == "Murcia, Región de" ~ "Murcia",
Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
Comunidad == "País Vasco" ~ "País Vasco",
Comunidad == "Rioja, La" ~ "La Rioja",
Comunidad == "Ceuta" ~ "Ceuta",
Comunidad == "Melilla" ~ "Melilla",
TRUE ~ Comunidad
)
)
# Pivotaje
uso_tic_total_pivotada <- uso_tic_total_corregido %>%
pivot_longer(
cols= -Comunidad,
names_to = "Grupo_Edad",
values_to = "Frecuencia_Total"
)
orden_grupos <- c("Frecuencia_Total_Niños", "Frecuencia_Total_Adultos", "Frecuencia_Total_Mayores")
names_grupos <- c("Niños (10-15)", "Adultos (16-74)", "Mayores (75+)")
uso_tic_ordenada <- uso_tic_total_pivotada %>%
mutate(Grupo_Edad = factor(Grupo_Edad, levels = orden_grupos, labels = names_grupos))
# Gráfico
ggplot(uso_tic_ordenada, aes(x=Comunidad, y=Frecuencia_Total, fill=Grupo_Edad))+
geom_bar(stat = "identity", position = "dodge")+
labs(
title= "Perfil de Uso Frecuente de las TIC por Edad y Comunidad",
y= "Porcentaje de Uso Promedio (%)",
x= "",
fill = "Grupo de Edad")+
scale_fill_brewer(palette = "Blues") +
theme_classic()+
theme(
axis.text.x = element_text(angle = 45, hjust = 1, size=10),
legend.position = "top"
)¿Existe un patrón territorial? Utilizamos un mapa interactivo para explorar si las comunidades más “conectadas” tienen mejores indicadores de salud mental.
Instrucciones: Pase el ratón por encima de cada comunidad para ver el desglose detallado de uso de internet por grupos de edad.
# Código extraído de: Mapa_España_TICS.R
# AJUSTE: layout="l-page" es CRÍTICO aquí para que el mapa se vea grande y bonito.
mapa_españa_ccaa <- esp_get_ccaa(moveCAN = TRUE)
# Corrección para mapa
uso_tic_total_corregido_mapa <- uso_tic_total %>%
mutate(
Comunidad = case_when(
Comunidad == "Balears, Illes" ~ "Baleares",
Comunidad == "Castilla - La Mancha" ~ "Castilla-La Mancha",
Comunidad == "Comunitat Valenciana" ~ "Comunidad Valenciana",
Comunidad == "Madrid, Comunidad de" ~ "Madrid",
Comunidad == "Murcia, Región de" ~ "Murcia",
Comunidad == "Navarra, Comunidad Foral de" ~ "Navarra",
Comunidad == "Rioja, La" ~ "La Rioja",
TRUE ~ Comunidad
)
)
mapa_con_datos <- mapa_españa_ccaa %>%
left_join(uso_tic_total_corregido_mapa, by = c("ccaa.shortname.es" = "Comunidad"))
# Tooltip arreglado para que se vea bien
mapa_con_datos <- mapa_con_datos %>%
mutate(
tooltip_data = paste0(
'<b>', ccaa.shortname.es, "</b><br>",
"Uso Adultos: ", round(Frecuencia_Total_Adultos, 1), "%<br>",
"Uso Niños: ", round(Frecuencia_Total_Niños, 1), "%<br>",
"Uso Mayores: ", round(Frecuencia_Total_Mayores, 1), "%"
)
)
colores_ccaa <- c(
"Andalucía" = "#C0C0C0", "Aragón" = "#FFD700", "Asturias" = "#0000FF",
"Baleares" = "#800080", "Canarias" = "#FFA500", "Cantabria" = "#008000",
"Castilla y León" = "#B0C4DE", "Castilla-La Mancha" = "#FF0000",
"Comunidad Valenciana" = "#ADD8E6", "Extremadura" = "#8B4513",
"Galicia" = "#40E0D0", "Madrid" = "#FFFF00", "Murcia" = "#FFC0CB",
"Navarra" = "#A52A2A", "País Vasco" = "#00FF00", "La Rioja" = "#DA70D6",
"Ceuta" = "#4682B4", "Melilla" = "#5F9EA0", "Cataluña" = "#FFDAB9"
)
mapa_estatico_gg <- ggplot(data = mapa_con_datos) +
geom_sf(
aes(fill = ccaa.shortname.es, text = tooltip_data),
color = "white", size = 0.2
) +
# Quitamos geom_sf_text porque a veces satura el mapa interactivo
scale_fill_manual(values = colores_ccaa) +
theme_void() +
theme(legend.position = "none")## Warning in layer_sf(geom = GeomSf, data = data, mapping = mapping, stat = stat,
## : Ignoring unknown aesthetics: text
Analizamos si la educación actúa como factor protector. El siguiente gráfico de doble eje muestra un cruce revelador:
Línea Azul (TICs): A mayor nivel educativo, mayor uso de tecnología.
Línea Roja (Depresión): A mayor nivel educativo, la depresión cae drásticamente.
# Código extraído de: Grafico_nivel_estudios.R
# AJUSTE: fig.height=6 y l-body-outset para que las líneas se vean claras.
if(exists("tabla_nivel_estudios_final")){
max_tics <- max(tabla_nivel_estudios_final$Porcentaje_TICS, na.rm = TRUE)
max_depresion <- max(tabla_nivel_estudios_final$Porcentaje_Depresion, na.rm = TRUE)
factor_escala <- max_tics / max_depresion
ggplot(tabla_nivel_estudios_final,
aes(x = as.numeric(factor(Nivel_de_estudios,
levels = c("Básico e inferior", "Intermedio", "Superior"))),
group = 1)) +
geom_line(aes(y = Porcentaje_TICS, color = "Uso de TICs"), linewidth = 1.2) +
geom_point(aes(y = Porcentaje_TICS, color = "Uso de TICs"), size = 4) +
geom_text(aes(y = Porcentaje_TICS, label = round(Porcentaje_TICS, 1)), vjust = -1.5, fontface="bold") +
geom_line(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), linewidth = 1.2) +
geom_point(aes(y = Porcentaje_Depresion * factor_escala, color = "Depresión"), size = 4) +
geom_text(aes(y = Porcentaje_Depresion * factor_escala, label = round(Porcentaje_Depresion, 1)), vjust = 2, fontface="bold") +
scale_y_continuous(
name = "Uso de TICs (%)",
sec.axis = sec_axis(~ . / factor_escala, name = "Depresión (%)")
) +
scale_x_continuous(
breaks = 1:3,
labels = c("Básico e inferior", "Intermedio", "Superior"),
name = "Nivel de Estudios"
) +
scale_color_manual(values = c("Uso de TICs" = "#1f77b4", "Depresión" = "#d62728")) +
labs(
title = "Nivel de Estudios: Factor Protector",
subtitle = "Relación inversa entre adopción tecnológica y depresión",
color = ""
) +
theme_classic() +
theme(legend.position = "bottom")
}Finalmente, llegamos a la “Paradoja Digital”. A menudo se asume que la conexión digital mejora las oportunidades, pero los datos muestran una realidad más compleja.
Comparamos dos grupos con niveles similares de uso de internet, pero realidades opuestas:
Estudiantes: Alta conectividad y baja depresión.
Desempleados: Alta conectividad y Muy alta depresión.
df_contexto <- mis_datos_salud_mental$depresion_actividad_economica %>%
rename(
Actividad = `Actividad.económica`,
Tipo_Depresion = `Prevalencia.depresión`,
Porcentaje = Total
) %>%
filter(
Sexo == "Ambos sexos",
Tipo_Depresion == "Cuadro depresivo mayor",
Actividad != "TOTAL"
) %>%
mutate(
Tasa_Depresion = parse_number(Porcentaje, locale = locale(decimal_mark = ",")),
Clave_Union = case_when(
# Intentamos capturar variantes comunes por si acaso
Actividad %in% c("Parado/a", "Parados", "En desempleo", "Desempleado") ~ "En desempleo",
Actividad == "Jubilado/a o prejubilado/a" ~ "Jubilado/Pensionista",
Actividad == "Labores del hogar" ~ "Labores del hogar",
Actividad == "Incapacitado/a para trabajar" ~ "Incapacitado",
TRUE ~ "Otros"
)
)
# Lógica visual simple
df_contexto <- df_contexto %>%
mutate(Color_Barra = ifelse(Tasa_Depresion == max(Tasa_Depresion, na.rm=TRUE), "#C0392B", "#95A5A6"))
# ==============================================================================
# 2. DATOS TIC (Uso de Internet)
# ==============================================================================
lista_frecuencias <- c(
"Han usado Internet diariamente (al menos 5 días a la semana)",
"Han utilizado internet varias veces al día"
)
df_tic_preparado <- mis_datos_tic$uso_internet_socioeconomico %>%
# 1. Renombrar usando los nombres que genera make.names (sin tildes)
rename(
Grupo = Clase.de.población,
Características = Características.socioeconómicas,
Frecuencia = Frecuencia.de.uso,
Total_TIC = Total
) %>%
# 2. Filtros (usando grepl para buscar "diariamente")
filter(
Grupo == "Total de personas (16 a 74 años)",
Frecuencia %in% lista_frecuencias
) %>%
mutate(
# 3. Usamos parse_number otra vez
Tasa_Internet = parse_number(Total_TIC, locale = locale(decimal_mark = ",")),
# 4. Homologación con grepl (equivalente a str_detect)
Clave_Union = case_when(
Características == "Situación laboral: Activos ocupados" ~ "Trabajando",
Características == "Situación laboral: Activos parados" ~ "En desempleo",
Características == "Situación laboral: Inactivos: Estudiantes" ~ "Estudiando",
Características == "Situación laboral: Inactivos: Pensionistas" ~ "Jubilado/Pensionista",
Características == "Situación laboral: Inactivos: Labores del hogar" ~ "Labores del hogar",
TRUE ~ "Otros"
)
) %>%
group_by(Clave_Union) %>%
summarise(Tasa_Internet = mean(Tasa_Internet, na.rm = TRUE))
# ==============================================================================
# 3. UNIÓN FINAL
# ==============================================================================
df_final<- left_join(df_contexto, df_tic_preparado, by = "Clave_Union") %>%
filter(!is.na(Tasa_Internet)) %>%
select(Clave_Union, Tasa_Depresion, Tasa_Internet, Color_Barra)
g1 <- ggplot(df_contexto, aes(x = reorder(Actividad, -Tasa_Depresion), y = Tasa_Depresion)) +
# Barras con color condicional (Rojo para desempleo)
geom_col(aes(fill = Color_Barra), width = 0.6, alpha = 0.9) +
# Etiquetas numéricas sobre las barras
geom_text(aes(label = paste0(Tasa_Depresion, "%")),
vjust = -0.5, fontface = "bold", color = "#2C3E50", size = 3.5) +
scale_fill_identity() +
# Truco técnico: str_wrap parte los textos largos del eje X
scale_x_discrete(labels = function(x) stringr::str_wrap(x, width = 10)) +
scale_y_continuous(limits = c(0, max(df_contexto$Tasa_Depresion) + 1.5)) +
# Títulos con formato HTML (ggtext)
labs(
title = "<span style='font-size:14pt'>1. El Contexto</span>",
subtitle = "El <span style='color:#C0392B'><b>Desempleo</b></span> es el factor crítico en la salud mental base.",
x = "", y = ""
) +
theme_fivethirtyeight() +
theme(
plot.title = element_markdown(face = "bold"),
plot.subtitle = element_markdown(size = 10),
axis.text.x = element_text(size = 8.5, face = "bold", lineheight = 0.9),
axis.text.y = element_blank(),
panel.grid.major = element_blank(),
plot.background = element_rect(fill = "white", color = NA),
panel.background = element_rect(fill = "white", color = NA)
)
# ==============================================================================
# 5. VISUALIZACIÓN: GRÁFICO 2 (EL GIRO)
# ==============================================================================
g2 <- ggplot(df_final_narrativa, aes(x = Tasa_Internet, y = Tasa_Depresion)) +
# Línea de tendencia
geom_smooth(method = "lm", se = FALSE, color = "aquamarine1", linetype = "solid", size = 1) +
# Puntos principales con borde blanco (estilo 'pop')
geom_point(aes(fill = Clave_Union), size = 6, shape = 21, color = "white", stroke = 1.5) +
# ggforce: Elipse para resaltar la paradoja (Estudiantes vs Parados)
geom_mark_ellipse(aes(filter = Clave_Union %in% c("En desempleo", "Estudiando"),
label = Clave_Union,
description = "Perfiles opuestos"),
label.fontsize = 8,
label.buffer = unit(5, "mm"),
con.cap = 0,
color = "grey50") +
# ggrepel: Etiquetas para el resto de puntos sin solapamiento
geom_text_repel(aes(label = Clave_Union),
data = subset(df_final_narrativa, !Clave_Union %in% c("En desempleo", "Estudiando")),
size = 3.5, color = "grey40", point.padding = 0.5) +
scale_fill_tableau() +
labs(
title = "<span style='font-size:14pt'>2. El Giro (TICs)</span>",
subtitle = "Alta tecnología no garantiza salud mental: comparar <b style='color:#F28E2B'>Estudiantes</b> vs <b style='color:#094B5B'>Parados</b>.",
x = "Uso Diario de Internet (%)",
y = "Depresión Mayor (%)",
caption = "Fuente: Elaboración propia con datos INE"
) +
theme_minimal(base_size = 12) +
theme(
plot.title = element_markdown(face = "bold"),
plot.subtitle = element_markdown(size = 10),
legend.position = "none",
axis.title = element_text(size = 9, face = "bold", color = "grey40"),
panel.grid.minor = element_blank(),
panel.grid.major = element_line(color = "grey95")
)## Warning: Using `size` aesthetic for lines was deprecated in ggplot2 3.4.0.
## ℹ Please use `linewidth` instead.
## This warning is displayed once every 8 hours.
## Call `lifecycle::last_lifecycle_warnings()` to see where this warning was
## generated.
# ==============================================================================
# 6. COMPOSICIÓN FINAL (PATCHWORK)
# ==============================================================================
#Ponemos un gráfico encima del otro con g1 / g2 porque sino se visualiza mal
layout_final <- g1 / g2 +
plot_annotation(
title = 'IMPACTO DEL TRABAJO Y LA BRECHA DIGITAL EN LA SALUD MENTAL',
subtitle = 'Análisis cruzado de Encuesta Europea de Salud y Encuesta TIC',
theme = theme(plot.title = element_text(size = 18, face = "bold", hjust = 0.5))
)
# Mostrar resultado final
print(layout_final)## `geom_smooth()` using formula = 'y ~ x'